/*
 * JTreePersonal.java
 *
 * Created on 27 de diciembre de 2005, 0:57
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package fmap.gui.jTreePersonal;

import java.awt.AWTEvent;
import java.awt.event.*;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JTree;
import javax.swing.ToolTipManager;
import javax.swing.UIManager;
import javax.swing.border.EmptyBorder;
import javax.swing.tree.TreeCellRenderer;
import javax.swing.tree.TreePath;

/**
 *
 * @author javi
 */
public class JTreePersonal extends JTree
{
    JPopupMenu popup;
    JPopupMenu popupCollection;
    JPopupMenu popupTreeFile;
    JMenuItem mi;
    
    
    public JTreePersonal ()
    {
        
        setCellRenderer (new MiRendererDeArbol ());
        
        // Establecemos el alto de la fila
        setRowHeight (15);
        setBorder ( new EmptyBorder (5,5,0,0) );
        
        // Para poder utilizar el tooltip en los nodos debemos registrar este componente en la clase ToolTipManager
        ToolTipManager.sharedInstance ().registerComponent (this);
        
        // Hacemos esto para que podamos mostrar un popupmenu
        enableEvents ( AWTEvent.MOUSE_EVENT_MASK );


        // define the popup
        popup = new JPopupMenu ();
        fmap.gui.actionListener.ListenerJTreePersonal listener = new fmap.gui.actionListener.ListenerJTreePersonal ( popup );
        mi = new JMenuItem ("Eliminar",new ImageIcon(getClass().getResource ("/fmap/img/elimina_mapa_ficheros.png")));
        mi.addActionListener (listener);
        mi.setActionCommand ("eliminar");
        popup.add (mi);
        popup.setOpaque (true);
        popup.setLightWeightPopupEnabled (true);

        // define the popup
        popupCollection = new JPopupMenu ();
        fmap.gui.actionListener.ListenerJTreePersonal listenerCollection = new fmap.gui.actionListener.ListenerJTreePersonal ( popupCollection );
        mi = new JMenuItem ("Editar",new ImageIcon(getClass().getResource ("/fmap/img/edit.png")));
        mi.addActionListener (listener);
        mi.setActionCommand ("editar");
        popupCollection.add (mi);
        mi = new JMenuItem ("Ordenar por nombre (ascendente)",new ImageIcon(getClass().getResource ("/fmap/img/arrow_up.png")));
        mi.addActionListener (listener);
        mi.setActionCommand ("ord_a_nombre");
        popupCollection.add (mi);
        mi = new JMenuItem ("Ordenar por nombre (descendente)",new ImageIcon(getClass().getResource ("/fmap/img/arrow_down.png")));
        mi.addActionListener (listener);
        mi.setActionCommand ("ord_d_nombre");
        popupCollection.add (mi);
        mi = new JMenuItem ("Ordenar por número de resultados (ascendente)",new ImageIcon(getClass().getResource ("/fmap/img/arrow_up.png")));
        mi.addActionListener (listener);
        mi.setActionCommand ("ord_a_resultados");
        popupCollection.add (mi);
        mi = new JMenuItem ("Ordenar por número de resultados (descendente)",new ImageIcon(getClass().getResource ("/fmap/img/arrow_down.png")));
        mi.addActionListener (listener);
        mi.setActionCommand ("ord_d_resultados");
        popupCollection.add (mi);
        popupCollection.setOpaque (true);
        popupCollection.setLightWeightPopupEnabled (true);



        // define the popup
/*
        popupTreeFile = new JPopupMenu ();
        fmap.gui.actionListener.ListenerPopupJTreePersonal listener1 = new fmap.gui.actionListener.ListenerPopupJTreePersonal ();
        JMenuItem mi = new JMenuItem ("Propiedades");
        mi.addActionListener (listener1);
        mi.setActionCommand ("propiedades");
        popupTreeFile.add (mi);
        
        popupTreeFile.setOpaque (true);
        popupTreeFile.setLightWeightPopupEnabled (true);
*/
        addMouseListener (listenerCollection);
        // AÑADIR ESTE LISTENER QUE NOS DICE CUANDO UN NODO ES SELECCIONADO => DE MANERA QUE FUNCIONE CON EL RATON Y EL TECLADO
        addTreeSelectionListener( listenerCollection );

    }
    
    
    public void expandTree ()
    {
        int numFilas = this.getRowCount ();
        
        for(int i=1; i<numFilas; i++)
        {
            this.expandRow (i);
            
            if(this.getRowCount () > numFilas) numFilas = this.getRowCount ();

        }
    }


    protected void processMouseEvent ( MouseEvent evt )
    {
        if( evt.isPopupTrigger () )
        {
            
            /** Con la posicion del puntero del raton averiguamos el treepath */
            TreePath nodoSeleccionado = super.getPathForLocation (evt.getX (),evt.getY ());
            if( nodoSeleccionado != null )
            {
                Object nodo = (Object)nodoSeleccionado.getLastPathComponent ();
                /** Si el objeto del jtree sobre el que nos encontramos en de tipo Cd lo seleccionamos y abrimos el menu popup */
                if( nodo instanceof fmap.model.MapF )
                {
                    super.setSelectionPath (nodoSeleccionado);
                    popup.show ( evt.getComponent (),evt.getX (),evt.getY () );
                }
                else if( ( nodo instanceof fmap.model.Collection ) )
                {
                    super.setSelectionPath (nodoSeleccionado);
                    popupCollection.show ( evt.getComponent (),evt.getX (),evt.getY () );
                }
/*                else if( nodo instanceof fmap.model.Node )
                {
                    super.setSelectionPath (nodoSeleccionado);
                    popupTreeFile.show ( evt.getComponent (),evt.getX (),evt.getY () );
                }
 */
            }
        }
        else
        {
            super.processMouseEvent ( evt );
        }
    }
    
    /*
     * Esta es la clase que va a permitir personalizar la presentaci�n
     * de cada una de las ramas del �rbol, de forma que no solamente
     * tengamos el texto correspondiente a la carta, o palo de la
     * baraja, sino un icono mostrando su imagen
     */
    public class MiRendererDeArbol extends JLabel implements TreeCellRenderer
    {
        private ImageIcon imgColeccion, imgCd1, imgCd3, imgUsb, imgDvd, imgUsb3, imgDvd3, buscando;
        private boolean seleccionado;
        
        public MiRendererDeArbol ()
        {
        }
        
        
        public Component getTreeCellRendererComponent ( JTree arbol,
                Object valor,boolean seleccionado,boolean expandido,
                boolean rama,int fila,boolean conFoco )
        {
            
            /**
             * Se fija el color de fondo en funci�n de que est� o no
             * seleccionada la celda del �rbol
             */
            setForeground (UIManager.getColor ("Table.selectionForeground"));
            
            if( !seleccionado )
                setBackground (UIManager.getColor ("Tree.background"));
            else
                setBackground (UIManager.getColor ("Tree.selectionBackground"));
            
            
            
            /**
             * Fijamos el icono que corresponde al texto de la celda, para
             * presentar la imagen de la carta que corresponde a esa celda
             * Si el nodo es root mostramos la imagen de la coleccion si el nodo es un cd mostramos la imagen del cd
             */
            if ( valor instanceof fmap.model.Collection )
            {
                fmap.model.Collection col = (fmap.model.Collection)valor;
                setIcon ( col.getImageTree () );
                setFont (new java.awt.Font ("Dialog", java.awt.Font.BOLD, 12));
            }
            else if(valor instanceof fmap.model.MapF)
            {
                fmap.model.MapF mapF = (fmap.model.MapF)valor;
                
                setIcon ( new ImageIcon ( getClass ().getResource (mapF.getIcon ())) );

                if( mapF.getNumResult () > 0 )  setFont (new java.awt.Font ("Dialog", java.awt.Font.BOLD, 12));
                else                            setFont (new java.awt.Font ("Dialog", java.awt.Font.PLAIN, 12));

            }
            // Suponemos que es un directorio
            else if(valor instanceof fmap.model.Node)
            {
                fmap.model.Node node = (fmap.model.Node)valor;
                setIcon ( new ImageIcon ( getClass ().getResource (node.getIcon ())) );
                setFont (new java.awt.Font ("Dialog", java.awt.Font.PLAIN, 12));
                
                setToolTipText (node.getDateString ());
            }

            setText (valor.toString ()+"  ");
            
            
            
            
            this.setSize ( valor.toString ().length () ,10);
            
            this.seleccionado = seleccionado;
            
            return( this);
        }
        
        
        /**
         * Sobreescribimos el m�todo paint() para fijar el color de
         * fondo. Normalmente, un JLabel puede pintar su propio fondo,
         * pero, seguramente debido aparentemente a un bug, o a una
         * limitaci�n en el TreeCellRenderer, es necesario recurrir
         * al m�todo paint() para hacer esto
         */
        public void paint ( Graphics g )
        {
            Color color;
            Icon currentI = getIcon ();
            
            // Fijamos el colos de fondo
            color = seleccionado ? UIManager.getColor ("Tree.selectionBackground") : UIManager.getColor ("Tree.background");
            
            g.setColor ( color );
            
            
            // Rellenamos el rect�ngulo que ocupa el texto sobre la celda del �rbol
            g.fillRect ( currentI.getIconWidth ()+2, 0, getWidth(),getHeight ()-1 );
            
            super.paint ( g );
        }
    }
}
